PAT--乙 1018 锤子剪刀布

1018 锤子剪刀布(题解)

大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:

图片

现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。

输入格式:

输入第 1 行给出正整数 N(≤10 5)即双方交锋的次数。随后 N 行,每行给出一次交锋的信息,即甲、乙双方同时给出的的手势。C 代表“锤子”、J 代表“剪刀”、B 代表“布”,第 1 个字母代表甲方,第 2 个代表乙方,中间有 1 个空格。

输出格式:

输出第 1、2 行分别给出甲、乙的胜、平、负次数,数字间以 1 个空格分隔。第 3 行给出两个字母,分别代表甲、乙获胜次数最多的手势,中间有 1 个空格。如果解不唯一,则输出按字母序最小的解。

输入样例:

1
2
3
4
5
6
7
8
9
10
11
10
C J
J B
C B
B B
B C
C C
C B
J B
B C
J J

输出样例:

1
2
3
5 3 2
2 3 5
B B

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <stdio.h>
#include <string.h>
int main()
{
int n;
int j[4]={0,0,0,0}; //j[0],j[1],j[2],分别记录甲获胜时各种手势的次数.j[3]记录平局的次数
int y[4]={0,0,0,0}; //y[0],y[1],y[2],分别记录乙获胜时各种手势的次数.
char a,b;
scanf("%d",&n); //接收双方交战的次数
for(int i=0;i<n;i++)
{
getchar();
scanf("%c %c",&a,&b);//接收双方的手势
if(a==b)
++(j[3]); //记录平局的次数
else //分别记录甲乙获胜时各种手势的次数
{
if((a=='C')&&(b=='J'))
++(j[0]);
if((a=='J')&&(b=='B'))
++(j[1]);
if((a=='B')&&(b=='C'))
++(j[2]);
if((a=='J')&&(b=='C'))
++(y[0]);
if((a=='B')&&(b=='J'))
++(y[1]);
if((a=='C')&&(b=='B'))
++(y[2]);
}
}
int sum=j[0]+j[1]+j[2]; //甲获胜的总次数
printf("%d %d %d\n",sum,j[3],n-sum-j[3]);//甲输的次数为交战总次数减平局次数和甲获胜次数
printf("%d %d %d\n",n-sum-j[3],j[3],sum);//乙获胜的次数为甲输的次数
int jmax=0,ymax=0; //分别记录甲乙获胜手势次数最大值的数组下标
for(int i=0;i<3;i++)
{
if(j[i]>j[jmax]&&j[i]!=0)
jmax=i;
if(y[i]>y[ymax]&&y[i]!=0)
ymax=i;
}
char jj,yy;//分别记录甲乙获胜最多的手势
if((jmax==0&&j[0]>j[2])||(jmax==1&&j[0]==j[1]))
jj='C';//1.最大值下标为0,并且C的次数大于B 2.最大值下标为1,C的次数和J的次数相等(CJ次数相等)
if(jmax==1&&j[1]>j[0]&&j[1]>j[2])
jj='J';//最大值下标为1,并且j的次数大于C和B
if((jmax==2)||(jmax==0&&j[0]==j[2])||(jmax==1&&j[1]==j[2])||(jmax==0&&j[0]==j[1]==j[2]==0))//1.最大值下标为2 2.最大值下标为0,C的次数等于B的次数 (CB次数相等)3.最大值下标为1,J的次数等于B的次数(JB次数相等) 4.BCJ次数完全相等,并等于零时.
jj='B';
if((ymax==0&&y[0]>y[2])||(ymax==1&&y[0]==y[1]))
yy='C';
if(ymax==1&&y[1]>y[0]&&y[1]>y[2])
yy='J';
if((ymax==2)||(ymax==0&&y[0]==y[2])||(ymax==1&&y[1]==y[2])||(ymax==0&&y[0]==y[1]==y[2]))
yy='B';
printf("%c %c",jj,yy);
return 0;
}

众所周知,石头剪刀步的规则是这样的:

在一局游戏中,双方各自出石头、剪刀、步其一。

胜负关系如下:

图片

甲和乙进行了多轮游戏,甲总共出了A次石头,B次剪刀,C次布;乙总共出了X次石头,Y次剪刀,Z次布。你需要求出甲最多获胜多少局。

输入描述;

第一行,三个非负整数,A,B,C。
第二行,三个非负整数,X,Y,Z。
保证A+B+C=X+Y+Z。

输出描述:

输出一行,一个整数表示答案

样例输入:

1
2
114514 0 0
0 114514 0

样例输入:

1
114514

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
int a[3],b[3]; //两个数组分别记录甲乙两人石头剪刀布各自的次数
int main()
{
long long sum=0;
scanf("%d %d %d",&a[0],&a[1],&a[2]);
scanf("%d %d %d",&b[0],&b[1],&b[2]);
sum=sum+(a[0]>=b[1]?b[1]:a[0]); //甲出石头乙出剪刀次数最少则为甲获胜的次数
sum=sum+(a[1]>=b[2]?b[2]:a[1]);
sum=sum+(a[2]>=b[0]?b[0]:a[2]);
printf("%lld",sum);
return 0;
}
小礼物走一个哟
0%